//备忘录模式
//将需要备份的类的信息存储在备忘录中  
//另外有一个备忘录的管理类  管理类中管理备忘录的模式，可用于实现撤销、恢复等工作
#ifndef __MEMENTO_H__
#define __MEMENTO_H__
#include <iostream>
#include <memory>
#include <vector>
#include "originator.h"
//发起类，内部有诸多的状态需要进行保存

//备忘录类，用于记录发起类的状态
//发起类并非所有的状态都需要进行记录
//备忘录使用struct来进行实现，可能更加方便
class Memento
{
public:
    using ptr = std::shared_ptr<Memento>;
    Memento(Originator::State state, int lifeValue, int attackValue, int defenceValue);
    Originator::State getState() { return m_state; }
    void setState(Originator::State state) { m_state = state; }
    int getLifeValue() { return m_lifeValue; }
    void setLifeValue(int lifeValue) { m_lifeValue = lifeValue; }
    int getAttackValue() { return m_attackValue; }
    void setAttackValue(int attackValue) { m_attackValue = attackValue; }
    void setDefenceValue(int defenceValue) { m_defenceValue = defenceValue; }
    int getDefenceValue() { return m_defenceValue; }

private:
    Originator::State m_state;
    int m_lifeValue;
    int m_attackValue;
    int m_defenceValue;
};
//备忘录管理者  使用vector管理备忘录
//可以进行备忘录的删减
class CareTaker
{
public:
    using ptr=std::shared_ptr<CareTaker>;
    CareTaker():m_mementos(){}
    //是否为空
    bool isEmpty();
    //前翻记录
    Memento::ptr preMemento();
    //后翻记录
    Memento::ptr nextMemento();
    //保存记录
    void addMementor(Memento::ptr memento);
    size_t size(){return m_mementos.size();}
private:
    std::vector<Memento::ptr> m_mementos;
    int curIndex=-1;
    
};
#endif
